State pattern
问题定义
假设我们需要制造一台糖果机,其操作如下:
我们可以分清楚各个状态以及状态的转换,当做一个简单的状态机来实现:
1 | public class GumballMachine { |
1 | public class GumballMachineTestDrive { |
当需要增加功能时,这份代码将十分难以修改和扩展,比如现在我们需要当曲柄被转动时,有10%的记录掉下两颗糖果。
更好的设计是:
- 定义一个state接口。在这个接口内,糖果机的每个动作都有一个对应的方法。
- 然后为机器的每个状态实现状态类。这些类将入则在对应状态下进行机器的行为。
- 将动作委托到状态类。
1 | public interface State { |
1 | public class NoQuarterState implements State { |
1 | public class GumballMachine { |
1 | public class GumballMachineTestDrive { |
定义状态模式
状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
状态模式跟策略模式形式上很相似,但是,意图不同!
状态模式将一群行为封装在状态对象中,运行过程中当前状态在状态对象集合中游走改变,但是客户端对于状态对象完全不了解。状态模式一般是用来避免在context中放置许多条件判断的替代方案,以便于扩展。
而策略模式中,通常是客户主动指定所需要的策略对象,以满足所需要的行为。策略模式是除继承之外一种弹性替代方案,可以避免被父类的行为困住,我们可以通过组合不同的对象来改变行为。
解决扩展问题
1 | public class GumballMachine { |
1 | public class WinnerState implements State { |
1 | package headfirst.state.gumballstatewinner; |